home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-05-03 | 6.3 KB | 182 lines | [TEXT/R*ch] |
- { OpenSelection.p ported by Matthew Xavier Mora}
- { ported from C.K. Han's openselection.c code }
- { 09-11-92 }
-
- unit openSelection;
- interface
- uses
- AppleTalk, PPCToolBox, Processes, EPPC, Notification, AppleEvents,
- {, Errors, Events, Memory, Resources, SegLoad, }
-
- (* Group 3 *)
- Aliases {, thermometer};
-
- function OpenSelection (var theFileToOpen: FSSpec): OSErr;
-
- implementation
- const
- kFinderType = 'FNDR';
- kSysCreator = 'MACS';
- kAEOpenSelection = 'sope';
- aeSelectionKeyword = 'fsel';
-
- { This runs through the process list looking for the indicated application
- }
- function FindAProcess (typeToFind, creatorToFind: Ostype;
- var processSN:ProcessSerialNumber;
- var infoRecToFill: ProcessInfoRec): OSErr;
- var
- tempPSN: ProcessSerialNumber;
- myErr: OSErr;
-
- begin
- myErr := noErr;
- tempPSN.lowLongOfPSN := kNoProcess;
- processSN.lowLongOfPSN := kNoProcess;
- processSN.highLongOfPSN := kNoProcess;
- repeat
- begin
- myErr := GetNextProcess(processSN);
- if (myErr = noErr) then
- myErr := GetProcessInformation(processSN, infoRecToFill);
- end;
- until ((infoRecToFill.processSignature = creatorToFind) or
- (infoRecToFill.processType = Longint(typeToFind)) or (myErr <> noErr));
-
- FindAProcess := myErr;
- end;
-
- function OpenSelection (var theFileToOpen: FSSpec): OSErr;
- var
- aeEvent, aeReply: AppleEvent;
- aeDirDesc, listElem: AEDesc;
- interactErr: OSErr;
- dirSpec, procSpec: FSSpec;
- fileList: AEDesc;
- myReply: StandardFileReply;
- myErr: OSErr;
- process: ProcessSerialNumber;
- DirAlias, FileAlias: AliasHandle;
- infoRec: ProcessInfoRec;
- processName: Str31;
- fullPath, appName: Str255;
- myAddressDesc: AEDesc;
- begin
- interactErr := noErr;
-
- if (true) then
- begin
- infoRec.processInfoLength := sizeof(ProcessInfoRec);
- infoRec.processName := @processName;
- infoRec.processAppSpec := @procSpec;
-
- myErr := FindAProcess(kFinderType, kSysCreator, process, infoRec);
- if (myErr = noErr) then
- myErr := AECreateDesc(typeProcessSerialNumber, @process,
- sizeof(process), myAddressDesc);
-
-
- if (myErr = noErr) then
- begin
-
- { Create the FinderEvent }
- myErr := AECreateAppleEvent(kFinderType, kAEOpenSelection,
- myAddressDesc,
- kAutoGenerateReturnID,
- kAnyTransactionID, aeEvent);
- { If you want to keep talking to this machine, you can keep
- this }
- { address desc around }
- myErr := AEDisposeDesc(myAddressDesc);
-
- if (myErr = noErr) then
- begin
- { Now we build all the bits of an OpenSelection event. }
- { Basically, we need to create an alias for the item to
- open,}
- { and an alias to the parent }
- { folder (directory) of that item. }
- { We can also pass a list of files if we want. }
- { You'll notice that for opening a finder window, the file
- and}
- { directory alias both point at the }
- { folder itself }
- { make a spec for the parent folder }
-
-
- myErr := FSMakeFSSpec(theFileToOpen.vRefNum,
- theFileToOpen.parID, '', dirSpec);
- myErr := NewAlias(nil, dirSpec, DirAlias);
-
- { Create alias for file }
- { if you are opening a window, then you make the file alias
- the}
- { same as the dir alias }
- myErr := NewAlias(nil, theFileToOpen, FileAlias);
- interactErr := AEInteractWithUser(kAEDefaultTimeout, nil,
- nil);
- if (interactErr = noErr) then
- myErr := SetFrontProcess(process);
-
- { Create the file list }
- if (myErr = noErr) then
- begin
- myErr := AECreateList(nil, 0, false, fileList);
-
- { create the folder descriptor }
- HLock(Handle(DirAlias));
- myErr := AECreateDesc(typeAlias, Ptr(DirAlias^),
- GetHandleSize(Handle(DirAlias)),
- aeDirDesc);
- HUnlock(Handle(DirAlias));
- myErr := AEPutParamDesc(aeEvent, keyDirectObject,
- aeDirDesc);
- if (myErr = noErr) then
- begin
- { done with the desc, kill it }
- myErr := AEDisposeDesc(aeDirDesc);
- { create the file descriptor and add to aliasList
- }
- HLock(Handle(FileAlias));
- myErr := AECreateDesc(typeAlias, Ptr(FileAlias^),
-
- GetHandleSize(Handle(FileAlias)),
- listElem);
- HLock(Handle(FileAlias));
- myErr := AEPutDesc(fileList, 0, listElem);
- end;
- if (myErr = noErr) then
- begin
-
- myErr := AEDisposeDesc(listElem);
-
- { Add the file alias list to the event }
- myErr := AEPutParamDesc(aeEvent,
- aeSelectionKeyword,
- fileList);
- myErr := AEDisposeDesc(fileList);
-
- if (myErr = noErr) then
- myErr := AESend(aeEvent, aeReply,
- kAENoReply + kAEAlwaysInteract +
- kAECanSwitchLayer,
- kAENormalPriority,
- kAEDefaultTimeout,
- nil, nil);
- end;
- end;
- myErr := AEDisposeDesc(aeEvent);
- end;
- end;
- end;
- if (DirAlias <> nil) then
- DisposHandle(Handle(DirAlias));
- if (FileAlias <> nil) then
- DisposHandle(Handle(FileAlias));
- OpenSelection := myErr;
- end;
-
- end.
-
-
-